<?php  if ( ! defined('BASE_PATH')) exit('No direct script access allowed');
/////////////////////////////////////////////////////////////////////////////
//
// SuperPHP - 快速的中文PHP框架
//
// @package		SuperPHP
// @author		hmw@superphp.org
// @copyright	Copyright (c) 2010, SuperPHP.ORG
// @license		http://www.superphp.org/user_guide/license.html
// @link		http://www.superphp.org
// @since		Version 1.0
//
// 许可协议请查看 http://www.SuperPHP.org/
//
/////////////////////////////////////////////////////////////////////////////

/**
 * Super_Html
 * 静态HTML生成类
 */
class Super_Html
{
	/**
	 * 生成单个静态页面
	 *
	 * @param spurl superUrl 的参数
	 * @param alias_url  生成HTML文件的名称，如果不设置alias_url，将使用年月日生成目录及随机数为文件名的形式生成HTML文件。
	 * @param update_mode   更新模式
     *     默认2为同时更新列表及文件
	 *     0是仅更新列表
	 *     1是仅更新文件
	 */
    public function make($spurl, $alias_url = null, $update_mode = 2) {
        if(TRUE === $GLOBALS['SUPER']['enable_module']) $spurl = array_pad($spurl, 5, null);
        else $spurl = array_pad($spurl, 4, null);
        $spurl[] = TRUE;
        if( '*' == $spurl[1] or '*' == $spurl[2] )return FALSE;
        $url_item = call_user_func_array($GLOBALS['SUPER']['html']['url_getter'],$spurl);
        if( $url_item ) {
            list($baseuri, $realfile) = $url_item;
        } else {
            if( null == $alias_url ) {
                $filedir = $GLOBALS['SUPER']['html']['file_root_name'].'/'.date('Y/n/d').'/';
                $filename = substr(time(),3,10).substr(mt_rand(100000, substr(time(),3,10)),4).".html";
            } else {
                $filedir = $GLOBALS['SUPER']['html']['file_root_name'].'/'.dirname($alias_url) . '/';
                $filename = basename($alias_url);
            }
            $baseuri = rtrim(dirname($GLOBALS['SUPER']['url']["url_path_base"]), '/\\')."/".$filedir.$filename;
            $realfile = dirname($_SERVER['SCRIPT_FILENAME'])."/".$filedir.$filename;
        }
        if( 0 == $update_mode or 2 == $update_mode )
            call_user_func_array($GLOBALS['SUPER']['html']['url_setter'], array($spurl, $baseuri, $realfile));
        if( 1 == $update_mode or 2 == $update_mode ) {
            __mkdirs(dirname($realfile));
            $cachedata = @file_get_contents('http://'.$_SERVER["SERVER_NAME"].call_user_func_array("superUrl",$spurl));
            @file_put_contents($realfile, $cachedata);
        }
    }

	/**
	 * 批量生成静态页面
	 * @param spurls 数组形式，每项是一个make()的全部参数
	 */
    public function makeAll($spurls) {
        foreach( $spurls as $single ) {
            list($spurl, $alias_url) = $single;
            $this->make($spurl, $alias_url, 0);
        }
        foreach( $spurls as $single ) {
            list($spurl, $alias_url) = $single;
            $this->make($spurl, $alias_url, 1);
        }
    }

	/**
	 * 获取url的列表程序，可以按配置开启是否检查文件存在
	 * @param controller    控制器名称，默认为配置'default_controller'
	 * @param action    动作名称，默认为配置'default_action'
	 * @param args    传递的参数，数组形式
	 * @param anchor    跳转锚点
	 * @param force_no_check    是否检查物理文件是否存在
	 *
	 */
    public function getUrl($module = null,$controller = null, $action = null, $args = null, $anchor = null, $force_no_check = FALSE) {
        $url_list = superAccess('r', 'super_url_list');
        if( $url_list ) {
            $url_list = explode("\n",$url_list);
            $args = (is_array($args) && !empty($args) ) ? serialize($args) : null;
            $url_input = "{$controller}|{$action}|{$args}|$anchor|";
            if($module) $url_input = "{$module}|".$url_input;
            foreach( $url_list as $url ) {
                if( substr($url,0,strlen($url_input)) == $url_input ) {
                    $url_item = explode("|",substr($url,strlen($url_input)));
                    if( TRUE == $GLOBALS['SUPER']['html']['safe_check_file_exists'] && TRUE != $force_no_check ) {
                        if( !is_readable($url_item[1]) )return FALSE;
                    }
                    return $url_item;
                }
            }
        }
        return FALSE;
    }

	/**
	 * 写入url的列表程序，在make生成页面后，将superUrl参数及页面地址写入列表中
	 *
	 * @param spurl superUrl的参数
	 * @param baseuri URL地址对应的静态HTML文件访问地址
     *
	 */
    public function setUrl($spurl, $baseuri, $realfile) {
        if(TRUE === $GLOBALS['SUPER']['enable_module']){
            @list($module,$controller, $action, $args, $anchor) = $spurl;
        } else {
            @list($controller, $action, $args, $anchor) = $spurl;
            $module = '';
        }
        $args = (is_array($args) && !empty($args)) ? serialize($args) : null;
        $url_input .= "{$controller}|{$action}|{$args}|$anchor|$baseuri|$realfile";

        //添加模块支持
        if($module) $url_input = "{$module}|".$url_input;
        $this->clear($module,$controller, $action, $args, $anchor, FALSE);
        $url_list = superAccess('r', 'super_url_list');
        if( $url_list ) {
            superAccess('w', 'super_url_list', $url_list."\n".$url_input);
        } else {
            superAccess('w', 'super_url_list', $url_input);
        }
    }

	/**
	 * 清除静态文件
	 *
     * @param module 需要清除HTML文件的模块名称
	 * @param controller    需要清除HTML文件的控制器名称
	 * @param action    需要清除HTML文件的动作名称，默认为清除该控制器全部动作产生的HTML文件
	 * 如果设置了action将仅清除该action产生的HTML文件
	 *
	 * @param args    传递的参数，默认为空将清除该动作任何参数产生的HTML文件
	 * 如果设置了args将仅清除该动作执行参数args而产生的HTML文件
	 *
	 * @param anchor    跳转锚点，默认为空将清除该动作任何锚点产生的HTML文件
	 * 如果设置了anchor将仅清除该动作跳转到锚点anchor产生的HTML文件
	 *
	 * @param delete_file    是否删除物理文件，FALSH将只删除列表中该静态文件的地址，而不删除物理文件。
	 */
    public function clear($module='',$controller='', $action = null, $args = null, $anchor = null, $delete_file = TRUE) {
        $url_list = superAccess('r', 'super_url_list');
        if( $url_list ) {
            $url_list = explode("\n",$url_list);
            $re_url_list = array();
            if( '*' == $action ) {
                $url_input = "{$controller}|";
            } elseif ( '*' == $args ) {
                $url_input = "{$controller}|{$action}|";
            } else {
                $url_input = "{$controller}|{$action}|{$args}|$anchor|";
            }

            //此处添加模块化支持
            if( $module ) $url_input = "{$module}|".$url_input;
            foreach( $url_list as $url ) {
                if( substr($url,0,strlen($url_input)) == $url_input ) {
                    $url_tmp = explode("|",$url);
                    if($module) $baseuri = $url_tmp[5];
                    else $baseuri = $url_tmp[4];
                    $realfile = dirname($_SERVER["SCRIPT_FILENAME"]).'/'.$baseuri;
                    if( TRUE == $delete_file )@unlink($realfile);
                } else {
                    $re_url_list[] = $url;
                }
            }
            superAccess('w', 'super_url_list', join("\n", $re_url_list));
        }
    }


	/**
	 * 清除全部静态文件
	 *
	 * @param delete_file    是否删除物理文件，FALSH将只删除列表中该静态文件的地址，而不删除物理文件。
	 */
    public function clearAll($delete_file = FALSE) {
        if( TRUE == $delete_file ) {
            $url_list = superAccess('r', 'super_url_list');
            if( $url_list ) {
                $url_list = explode("\n",$url_list);
                foreach( $url_list as $url ) {
                    $url_tmp = explode("|",$url);
                    if(TRUE === $GLOBALS['SUPER']['enable_module']) $baseuri = $url_tmp[5];
                    else $baseuri = $url_tmp[4];
                    $realfile = dirname($_SERVER["SCRIPT_FILENAME"]).'/'.$baseuri;
                    @unlink($realfile);
                }
            }
        }
        superAccess('c', 'super_url_list');
    }
}
?>
